package com.tao.YanMoDesignPattern.composite.case3_ring;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Mi_Tao
 * @Date 2023/8/27
 * @Description
 * @Version 1.0
 **/
public class Composite extends Component {

    // 用来存储组合对象中包含的子组件
    private List<Component> childComponents = null;


    // 组合对象的名字
    private String name = "";

    public Composite(String name) {
        this.name = name;
    }

    @Override
    public void printStruct(String preStr) {
        // 先把自己输出取出
        System.out.println(preStr + "+" + this.name);
        // 如果还包含子组件，那么就输出这些子组件
        if (childComponents != null) {
            preStr+=" ";
            for (Component child : childComponents) {
                // 递归输出每个子组件
                child.printStruct(preStr);
            }
        }
    }

    public void addChild(Component child) {
        // 延迟初始化
        if (childComponents == null) {
            childComponents = new ArrayList<>();
        }
        childComponents.add(child);

        // 添加对父组件的引用
        child.setParent(this);

        // 先判断组件路径是否为空,如果是空，说明本组件是各组件
        // 根组件，那么就设置组件路径为空
        if (this.getComponentPath() == null || this.getComponentPath().trim().length()==0) {
            // 把本组件的name设置到组件路径中
            this.setComponentPath(this.name);
        }

        // 先判断要加入的组件再路径上是否出现过
        if (this.getComponentPath().startsWith(child.getName()+".")){
            // 说明是根组件，重复添加了
            throw new IllegalArgumentException("在本通路上，组件"+child.getName()+"已经存在");
        }
        else {
            if (this.getComponentPath().indexOf("."+child.getName())<0){
                // 表示没有出现过，那么可以加入
                // 计算组件的路径
                String componentPath = this.getComponentPath() + "." + child.getName();
                // 设置子组件的路径
                child.setComponentPath(componentPath);
            }else {
                throw new IllegalArgumentException("在本通路上，组件"+child.getName()+"已经存在");
            }
        }


    }

    @Override
    public void removeChild(Component c) {
        if (childComponents != null) {
            // 查找到要删除的组件在集合中的索引位置
            int index = childComponents.indexOf(c);
            if (index != -1){
                // 先把被删除的商品类型对象的父商品类别
                // 设置成为被删除的商品类型对象的父商品雷兵
                c.getChildren().forEach(child -> {
                    // 删除的组件对象是实例的一个子组件对象
                    child.setParent(this);
                    // 把被删除的组件对象的子组件对象添加到当前实例中
                    childComponents.add(child);
                });
            }
            // 真的删除
            childComponents.remove(c);
        }
    }

    public Component getChildren(int index) {
        if (childComponents != null && index > 0 && index < childComponents.size()) {
            return childComponents.get(index);
        }
        return null;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public List<Component> getChildren() {
        return childComponents;
    }
}
